// LikeController.js - 点赞控制器
const Like = require('../models/Like');
const Video = require('../models/Video');

/**
 * 点赞控制器类
 * 处理用户点赞相关的请求
 */
class LikeController {
  /**
   * 点赞视频
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  static async likeVideo(req, res) {
    try {
      const { videoId } = req.body;
      const userId = req.user.id;
      
      // 验证参数
      if (!videoId || typeof videoId !== 'number') {
        return res.status(400).json({
          code: 400,
          message: '请提供有效的视频ID',
          data: null
        });
      }
      
      // 检查是否已经点赞
      const isLiked = await Like.checkLike(userId, videoId);
      if (isLiked) {
        return res.status(400).json({
          code: 400,
          message: '您已经点赞过该视频',
          data: null
        });
      }
      
      // 创建点赞记录
      await Like.create(userId, videoId);
      
      // 更新视频点赞数
      await Video.updateLikeCount(videoId, 1);
      
      // 获取最新点赞数
      const likeCount = await Like.getLikeCount(videoId);
      
      res.status(200).json({
        code: 200,
        message: '点赞成功',
        data: {
          liked: true,
          likeCount: likeCount
        }
      });
    } catch (error) {
      console.error('点赞失败:', error);
      
      // 处理重复点赞的错误（唯一索引冲突）
      if (error.name === 'SequelizeUniqueConstraintError') {
        return res.status(400).json({
          code: 400,
          message: '您已经点赞过该视频',
          data: null
        });
      }
      
      res.status(500).json({
        code: 500,
        message: '点赞失败，请稍后重试',
        data: null
      });
    }
  }

  /**
   * 取消点赞
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  static async unlikeVideo(req, res) {
    try {
      const { videoId } = req.body;
      const userId = req.user.id;
      
      // 验证参数
      if (!videoId || typeof videoId !== 'number') {
        return res.status(400).json({
          code: 400,
          message: '请提供有效的视频ID',
          data: null
        });
      }
      
      // 检查是否已经点赞
      const isLiked = await Like.checkLike(userId, videoId);
      if (!isLiked) {
        return res.status(400).json({
          code: 400,
          message: '您尚未点赞该视频',
          data: null
        });
      }
      
      // 取消点赞
      const result = await Like.destroy(userId, videoId);
      
      if (result === 0) {
        return res.status(400).json({
          code: 400,
          message: '取消点赞失败，可能您尚未点赞',
          data: null
        });
      }
      
      // 更新视频点赞数
      await Video.updateLikeCount(videoId, -1);
      
      // 获取最新点赞数
      const likeCount = await Like.getLikeCount(videoId);
      
      res.status(200).json({
        code: 200,
        message: '取消点赞成功',
        data: {
          liked: false,
          likeCount: likeCount
        }
      });
    } catch (error) {
      console.error('取消点赞失败:', error);
      res.status(500).json({
        code: 500,
        message: '取消点赞失败，请稍后重试',
        data: null
      });
    }
  }

  /**
   * 检查是否已点赞
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  static async checkLikeStatus(req, res) {
    try {
      const { videoId } = req.query;
      const userId = req.user.id;
      
      // 验证参数
      if (!videoId || typeof parseInt(videoId) !== 'number') {
        return res.status(400).json({
          code: 400,
          message: '请提供有效的视频ID',
          data: null
        });
      }
      
      // 检查点赞状态
      const isLiked = await Like.checkLike(userId, parseInt(videoId));
      
      // 获取点赞数
      const likeCount = await Like.getLikeCount(parseInt(videoId));
      
      res.status(200).json({
        code: 200,
        message: '获取点赞状态成功',
        data: {
          liked: isLiked,
          likeCount: likeCount
        }
      });
    } catch (error) {
      console.error('获取点赞状态失败:', error);
      res.status(500).json({
        code: 500,
        message: '获取点赞状态失败，请稍后重试',
        data: null
      });
    }
  }

  /**
   * 获取用户点赞的视频列表
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  static async getUserLikedVideos(req, res) {
    try {
      const userId = req.user.id;
      const { page = 1, pageSize = 10 } = req.query;
      
      // 验证参数
      const pageNum = parseInt(page, 10) || 1;
      const size = parseInt(pageSize, 10) || 10;
      
      // 获取用户点赞的视频ID列表
      const videoIds = await Like.getUserLikedVideos(userId, pageNum, size);
      
      res.status(200).json({
        code: 200,
        message: '获取用户点赞视频列表成功',
        data: {
          videoIds: videoIds,
          page: pageNum,
          pageSize: size
        }
      });
    } catch (error) {
      console.error('获取用户点赞视频列表失败:', error);
      res.status(500).json({
        code: 500,
        message: '获取用户点赞视频列表失败，请稍后重试',
        data: null
      });
    }
  }
}

module.exports = LikeController;